<?php
/**
 * @brief 商家登录控制器
 * @class Seller
 * @author chendeshan
 * @datetime 2014/7/19 15:18:56
 */
class SystemSeller extends IController
{
	public $layout = '';

	/**
	 * @brief 商家登录动作
	 */
	public function login()
	{
		$seller_name = IFilter::act(IReq::input('username'));
		$password    = IReq::input('password');
		$message     = '';

		if($seller_name == '')
		{
			$message = '登录名不能为空';
		}
		else if($password == '')
		{
			$message = '密码不能为空';
		}
        else
		{
			$sellerObj = new IModel('seller');
			$sellerRow = $sellerObj->getObj('seller_name = "'.$seller_name.'" or mobile = "'.$seller_name.'" and is_del = 0 and is_lock = 0');
			if($sellerRow && ($sellerRow['password'] == md5($password)))
			{
				$dataArray = array(
					'login_time' => ITime::getDateTime(),
				);
				$sellerObj->setData($dataArray);
				$where = 'id = '.$sellerRow["id"];
				$sellerObj->update($where);
			
				//存入私密数据
				ISafe::set('seller_id',$sellerRow['id']);
				ISafe::set('seller_name',$sellerRow['seller_name']);
				ISafe::set('seller_pwd',$sellerRow['password']);

				//通知事件
				plugin::trigger("sellerLoginCallback",$sellerRow);
				// 生成token
                $token = $this->_generateToken($sellerRow);
                ISafe::set('token', $token);

                $data = [
                    'seller_id' => $sellerRow['id'],
                    'seller_name' => $sellerRow['seller_name'],
                    'true_name' => $sellerRow['true_name'],
                ];

				JSON::jsonSuccess($data);
			}
			else
			{
				$message = '用户名与密码不匹配';
			}
		}

		if($message != '')
		{
			JSON::jsonErr(100001,'',['return_msg' => $message]);
            exit;
		}
	}

	//后台登出
	function logout()
	{
		plugin::trigger('clearSeller');
    	$this->redirect('index');
	}

	/**
     * @brief 生成token
     * @param array $userRow 用户信息
     * @return string token
     * 这里写一个生成token的方法，根据userLoginCallback方法返回的用户信息，生成一个token，将token返回，
     * 客户端可以将token存储在cookie中，或者localStorage中，或者sessionStorage中，
     * 客户端每次请求时，将token作为请求头或者请求参数传递给服务器，服务器可以根据token来判断用户是否登录，
     * 如果登录，就返回用户信息，否则返回错误信息，
     * 客户端可以根据返回的错误信息来判断用户是否登录，
     * 这里生成的token是一个字符串，要能验证，是否过期、是否被篡改等，
     * 可以使用md5加密，加上时间戳，加上用户id，加上用户密码，加上一个密钥，
     * 然后再进行md5加密，这样生成的token就可以验证了，
     */
    private function _generateToken($sellerRow)
    {
        $token = md5($sellerRow['id']. $sellerRow['password']. ITime::getDateTime(). 'aircheng');
        // 这里使用这个token作为key，将用户信息存入缓存中，明文即可
        ISafe::set($token, [
            'seller_id' => $sellerRow['id'],
            'seller_name' => $sellerRow['seller_name'],
            // 过期时间
            'expire_time' => ITime::getDateTime('Y-m-d H:i:s', strtotime('+1 day')),
        ]);
        return $token;
    }
}